package com.zyx.concurrentdemo.c05memory;

import java.io.Serializable;

/**
 * @author zyx
 * @since 2021/10/17 12:15
 * desc: dcl模式创建
 */
public final class Singleton implements Serializable {
    private Singleton() {
    }

    // 必须使用volatile修饰, 否则由于指令重排可能造成初始化时部分线程获取了空的实例
    private static volatile Singleton INSTANCE = null;

    public static Singleton getInstance() {
        // 实例没创建，才会进入内部的 synchronized代码块
        /*if (INSTANCE == null) {
            synchronized (Singleton.class) {
                // 也许有其它线程已经创建实例，所以再判断一次
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;*/


        if (INSTANCE != null) {
            return INSTANCE;
        }
        synchronized (Singleton.class) {
            // 也许有其它线程已经创建实例，所以再判断一次
            if (INSTANCE == null) {
                INSTANCE = new Singleton();
            }
            return INSTANCE;
        }
    }

    /**
     * 防止反序列化创建新的对象破坏 单例模式
     * @return JVM反序列化时返回的指定对象, 保证单例规则
     */
    public Object readResolve() {
        return INSTANCE;
    }
}
